package com.quyunshuo.module.home.activity.stat

import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.os.Build
import androidx.activity.viewModels
import androidx.annotation.RequiresApi
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.github.mikephil.charting.charts.BarChart
import com.github.mikephil.charting.components.Legend
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.data.BarEntry
import com.quyunshuo.edwinpro.common.ui.BaseActivity
import com.quyunshuo.module.home.R
import com.quyunshuo.module.home.activity.stat.chart.BarChartDataHelper
import com.quyunshuo.module.home.activity.stat.chart.BarChartRender
import com.quyunshuo.module.home.activity.stat.chart.ChineseWeekdayFormatter
import com.quyunshuo.module.home.databinding.HomeActivityStatBinding
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch

@AndroidEntryPoint
class StatActivity :
    BaseActivity<HomeActivityStatBinding, StatViewModel>() {

    companion object {
        fun newInstance(context: Context) {
            context.startActivity(Intent(context, StatActivity::class.java))
        }
    }


    /**
     * 通过 viewModels() + Hilt 获取 ViewModel 实例
     */
    override val mViewModel by viewModels<StatViewModel>()


    override fun createVB() = HomeActivityStatBinding.inflate(layoutInflater)


    @RequiresApi(Build.VERSION_CODES.O)
    @SuppressLint("ClickableViewAccessibility")
    override fun HomeActivityStatBinding.initView() {
        //1. 初始化图标
        initBloodSugarBarChart(barChartView)


        // 设置数据
//        createBarData()


    }


    override fun HomeActivityStatBinding.initListener() {
        homeReturn.setOnClickListener {
            onBackPressed()
        }
        week.isSelected = true
        week.setOnClickListener {
            week.isSelected = true
            month.isSelected = false
            year.isSelected = false
        }
        month.setOnClickListener {
            week.isSelected = false
            month.isSelected = true
            year.isSelected = false
        }
        year.setOnClickListener {
            week.isSelected = false
            month.isSelected = false
            year.isSelected = true
        }

    }


    override fun initObserve() {
        lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                mViewModel.stats.collect {
                    when (it) {
                        is StatViewModel.StatsResult.Error -> {}
                        is StatViewModel.StatsResult.Success -> {
                            mBinding.dayCount.text = it.focusDays.toString()
                            mBinding.minuteCount.text = it.totalMinutes.toString()
                            mBinding.count.text = it.recordsCount.toString()
                        }

                        null -> {}
                    }
                }
            }
        }
        lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                mViewModel.weeklyDetails.collect{

                    createBarData(mViewModel.getChartDataForWeek())
//                    val entries = ArrayList<BarEntry>()
//                    it.forEachIndexed { index, concentrationEntity ->
//                        entries.add(BarEntry(index.toFloat(), 1f))
//                    }


                }
            }
        }


    }


    override fun initRequestData() {
        mViewModel.loadStats()
    }


    fun initBloodSugarBarChart(chartView: BarChart) {

        // =================1. 配置图表视图的各种属性 ================= ================= ================= ================= ================= =================
        chartView.isLogEnabled = false  // 禁用图表库的内部日志输出（提升性能，减少日志干扰）

        // 设置自定义渲染器（用于控制柱状图的绘制逻辑）  todo 绘制柱状图 ，注意，这里不涉及柱子随着数据量而改变宽度。不是这里。
        chartView.renderer =
            BarChartRender(
                chartView,                   // 图表视图实例
                chartView.getAnimator(),     // 动画控制器（用于处理图表动画）
                chartView.getViewPortHandler() // 视口处理器（控制图表显示区域）
            )

        // 网格与背景设置
        chartView.setDrawGridBackground(false)  // 不绘制网格背景（保持透明，减少视觉干扰）
        chartView.description.isEnabled = false  // 禁用图表右下角的描述标签（精简界面）

        // 空数据提示
        chartView.setNoDataText("")  // 设置无数据时显示空文本（不显示默认提示）

        // 高亮交互设置
        chartView.isHighlightFullBarEnabled = true  // 点击时高亮整个柱状（而非单个值段）
        chartView.isHighlightPerTapEnabled = true   // 启用点击高亮效果
        chartView.isHighlightPerDragEnabled = false // 禁用拖拽时的高亮（避免误触）

        // 触摸交互设置
        chartView.setTouchEnabled(true)           // 启用触摸交互（允许用户与图表交互）
        chartView.isDragEnabled = true            // 启用图表拖拽（允许水平滚动查看数据）
        chartView.setScaleEnabled(false)          // 禁用缩放功能（保持固定比例）
        chartView.setPinchZoom(false)             // 禁用双指缩放（避免意外缩放）
        chartView.isDoubleTapToZoomEnabled = false // 禁用双击缩放（保持图表稳定性）


        //  =================2. 底部X轴设置 ================= ================= ================= ================= ================= =================
        // 获取图表的X轴实例
        val xAxis: XAxis = chartView.xAxis

        // 设置X轴位置：在图表底部显示
        xAxis.position = XAxis.XAxisPosition.BOTTOM

        // 不绘制X轴方向的网格线（避免干扰数据展示）
        xAxis.setDrawGridLines(false)

        // 设置X轴轴线宽度和颜色
        xAxis.axisLineWidth = 0f  // 设置轴线宽度为1dp
        xAxis.axisLineColor = Color.parseColor("#ffffff") // 设置轴线为浅灰色
        xAxis.valueFormatter = ChineseWeekdayFormatter()
        // 设置X轴标签的文本样式
        xAxis.textSize = 12f  // 设置标签文本大小为12sp
        xAxis.textColor = Color.parseColor("#A7ADB6") // 设置文本为浅蓝色(比轴线稍淡)
        // 提示：也可使用资源文件中的颜色值（需将注释部分替换）
        // xAxis.textColor = resources.getColor(R.color.text_light_color)

        // 调整标签的偏移量（微调位置）
        xAxis.xOffset = -3f   // 水平向右偏移-3dp（实际向左移动）
        xAxis.yOffset = 6.5f  // 垂直向下偏移6.5dp（离轴线更远）

        // 设置刻度颗粒度（保证只显示整数值）
        xAxis.granularity = 1f  // 最小间隔为1（防止显示小数或间隔不均）

        // 设置自定义数值格式化器（控制标签显示内容）

        //  =================3. 禁用右侧Y轴  ================= ================= ================= ================= ================= =================
        chartView.axisRight.isEnabled = false
        chartView.axisLeft.isEnabled = false

        // 左侧Y轴设置
//        val axisLeft: YAxis = chartView.axisLeft  // 获取左侧Y轴对象
//
//        // 设置左侧Y轴属性
//        axisLeft.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART)  // 设置标签位置在图表外部
//        axisLeft.setDrawAxisLine(false)              // 禁用轴线条绘制（不显示Y轴线）
//        axisLeft.gridLineWidth = 1f                  // 设置网格线宽度为1像素
//        axisLeft.gridColor = Color.parseColor("#DBDFE5")  // 设置网格线颜色为浅灰色
//        axisLeft.isEnabled = true                    // 启用左侧Y轴
//        axisLeft.textSize = 12f                      // 设置标签文本大小为12SP
//        axisLeft.textColor = Color.parseColor("#A7ADB6")  // 设置标签文本颜色为浅蓝色
//        axisLeft.setLabelCount(6, true)               // 设置Y轴显示6个刻度值（强制精确数量）

        // ================= 4. 图表视图全局设置 ================= ================= ================= ================= ================= =================
        chartView.minOffset = 0.0f                   // 设置图表最小内边距为0
        chartView.setDragOffsetX(10.0f)              // 设置横向拖拽偏移量（响应滑动操作）
        chartView.setExtraOffsets(10f, 10f, 22.0f, 20.0f)  // 设置额外边距（左，上，右，下）
        chartView.legend.isEnabled = false           // 禁用图例显示
        chartView.marker = null                      // 移除数据标记（点击时显示的提示框）
        chartView.setDrawMarkers(false)              // 禁用数据标记绘制
        chartView.setDrawBarShadow(false)            // 禁用柱状图阴影效果
        chartView.setDrawValueAboveBar(false)        // 将柱状图数值标签显示在柱体内部（而非上方）

    }


    private fun createBarData(entries:ArrayList<BarEntry>) {

//        val entries = ArrayList<BarEntry>()
//        entries.add(BarEntry(0f, 5.2f)) // 第1天
//        entries.add(BarEntry(1f, 6.8f)) // 第2天
//        entries.add(BarEntry(2f, 7.5f)) // 第3天
//        entries.add(BarEntry(3f, 5.2f)) // 第1天
//        entries.add(BarEntry(4f, 6.8f)) // 第2天
//        entries.add(BarEntry(5f, 7.5f)) // 第3天
//        entries.add(BarEntry(6f, 5.2f)) // 第1天
//        entries.add(BarEntry(7f, 6.8f)) // 第2天
//        entries.add(BarEntry(8f, 7.5f)) // 第3天

        // 准备颜色（根据状态）
        val colors = ArrayList<Int>()
        colors.add(resources.getColor(R.color.base_colorPrimary)) // 正常
        colors.add(resources.getColor(R.color.base_colorPrimary)) // 偏高
        colors.add(resources.getColor(R.color.base_colorPrimary)) // 过高


        // 配置图表
        BarChartDataHelper.setupChart(
            mBinding.barChartView,
            entries,
            colors,
            1f,  // 最大值
            0f,  // 最小值
            false // 滚动到最后
        )
        mBinding.barChartView.invalidate() // 刷新图表

    }

    private fun setupBarChart(barChart: BarChart) {
        // 基本配置
        barChart.setDrawBarShadow(false) // 禁用柱状图阴影
        barChart.setDrawValueAboveBar(true) // 数值显示在柱状图上方
        barChart.setPinchZoom(false) // 禁用捏合缩放
        barChart.setDrawGridBackground(false) // 禁用网格背景
        barChart.description.isEnabled = false // 禁用描述


        // 动画效果
        barChart.animateY(1500) // Y轴动画时长1500ms


        // X轴配置
        val xAxis = barChart.xAxis
        xAxis.position = XAxis.XAxisPosition.BOTTOM // X轴位置在底部
        xAxis.setDrawGridLines(false) // 禁用X轴网格线
        xAxis.granularity = 1f // 最小间隔
        xAxis.labelCount = 7 // 标签数量


        // Y轴配置（左侧）
        val leftAxis = barChart.axisLeft
        leftAxis.setDrawGridLines(true) // 启用网格线
        leftAxis.granularity = 10f // 最小间隔
        leftAxis.axisMinimum = 0f // 最小值从0开始


        // Y轴配置（右侧）
        val rightAxis = barChart.axisRight
        rightAxis.isEnabled = false // 禁用右侧Y轴


        // 图例配置
        barChart.legend.isEnabled = false // 启用图例
        barChart.legend.verticalAlignment = Legend.LegendVerticalAlignment.TOP
        barChart.legend.horizontalAlignment = Legend.LegendHorizontalAlignment.RIGHT
        barChart.legend.orientation = Legend.LegendOrientation.HORIZONTAL
        barChart.legend.setDrawInside(false)


        // 数据高亮配置
        barChart.isHighlightFullBarEnabled = true
        barChart.isHighlightPerTapEnabled = true
    }
}